package com.opensky.common.infrastructure.exception;

/**
 * 错误码规范示例
 *
 * @author yin.zhu@dreamkey.io
 * @date 2021年11月18日
 */
public enum HTTPStatus implements StatusCode{

    /*
     * 一：错误码定义共分为5大类
     *   A：复用HTTP状态码
     *   B：以1开头，客户端（用户端）错误 以1开头
     *   C：以2开头，服务端（本系统）错误
     *   D：以3开头，第三方（调用的其他微服务）错误
     *   E：以4开头，包含业务流程分支的错误码
     *   其中除A外 B C D E F都为5位
     * 二：错误码定义粒度说明
     *   1：因为我们不是做向外出售API业务的系统、所以错误码粒度大可不必很细
     *   2：很多时候（包含业务流程分支的除外）前端只需要知道错误码是否为200即可、无需知道具体
     *   3：一类错误定义一个错误码 简短错误信息在msg中输出
     *       正例：10002：用户登录相关错误 PS（以1开头视为客户端错误 0002视为用户登录请求这一类错误）
     *       反例：10001：用户不存在
     *            10002：密码错误
     *            10003：用户已被禁用
     * 三：E类错误码使用说明
     *   1：前端对于获取到的非200状态码需要进行业务逻辑判断时使用
     *   2：E类错误码无需遵循一类错误定义为一个错误码的规范、即一个E类码代表一种具体业务逻辑
     *   3：例（投盟项目）：用户登录失败具体原因为：首次登录且未同意用户登录协议
     *                   后端返回错误码：400001 前端根据此错误码进行业务逻辑处理
     * */

    /*A类错误码 复用HTTP状态码*/
    /*参考地址 : https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status*/
    RC200(200, "请求成功"),

    RC400(400, "请求参数有误或语义有误,当前请求无法被服务器理解"),
    RC401(401, "当前请求需要用户验证"),
    RC403(403, "服务器已经理解请求,但是拒绝执行"),
    RC404(404, "请求失败,请求所希望得到的资源未被在服务器上发现"),
    RC405(405, "请求行中指定的请求方法不能被用于请求相应的资源"),
    RC408(408, "请求超时"),

    RC500(500, "服务器内部错误，无法完成请求"),
    RC503(503, "由于超载或系统维护，服务器暂时的无法处理客户端的请求"),

    // 自定义错误码
    RC10002(10002, "登录相关错误"),
    RC10003(10003, "旧密码错误"),

//    /*B类错误码 客户端错误*/
//    int CODE_10000 = 10000; // 请求校验相关错误 如：超频、越权
//    int CODE_10001 = 10001; // 请求参数校验相关错误 如：参数非法
//    int CODE_10002 = 10002; // 登录相关错误 如：密码错误、账号禁用
//    int CODE_10003 = 10003; // 文件上传相关错误 如：不允许此类文件
//    int CODE_10004 = 10004; // 用户重复、非法操作 如：重复提交、当前状态数据不允许xxx
//    int CODE_10005 = 10005; // 配置问题 如：配置错误或无配置
//
//    /*C类错误码 服务端错误*/
//    int CODE_20000 = 20000; // 暂定
//    int CODE_20001 = 20001; // 暂定
//    int CODE_20002 = 20002; // 登录相关错误 如：系统维护、暂时不支持登录
//    int CODE_20003 = 20003; // 文件上传相关错误 如：系统内部文件IO异常
//
//    /*D类错误码 第三方错误*/
//    int CODE_30001 = 30001; // 微信小程序官方API接口调用异常
//    int CODE_30002 = 30002; // 微信支付官方API接口调用异常
//    int CODE_30003 = 30003; // 阿里云官方API接口调用异常
//    int CODE_30004 = 30004; // 阿里云API市场接口调用异常
//    int CODE_30005 = 30005; // 账号权限微服务异常
//    int CODE_30006 = 30006; // 文档存储微服务异常
//    int CODE_30007 = 30007; // 结算微服务异常
//    int CODE_30008 = 30008; // 链环境异常
//
//    /*E类错误码 业务流程分支*/
//    int CODE_40001 = 40001; // 账号尚未认证成功
//    int CODE_40002 = 40002; // 此账户已被其他机构关联，不能重复关联


    ;


    /**
     * 自定义状态码
     **/
    private final int code;
    /**
     * 自定义描述
     **/
    private final String message;

    HTTPStatus(int code, String message) {
        this.code = code;
        this.message = message;
    }


    @Override
    public int getCode() {
        return code;
    }

    @Override
    public String getMessage() {
        return message;
    }

    }
